// http://www.cs.cf.ac.uk/Dave/C/node25.html
// http://stackoverflow.com/questions/3056307/how-do-i-use-mqueue-in-a-c-program-on-a-linux-based-system
// ----------------
// msgsend run first, it create msqid
// ----------------
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>

#define MSGSZ     128

typedef struct msgbf{
	long mtype;
	char mtext[MSGSZ];
}message_buf;

main(){
    int msqid;
    int msgflg = IPC_CREAT | 0666;
    key_t key;
    message_buf sbuf;
    size_t buf_length;

	/*
     * Get the message queue id for the "name" 1234,
     * which was created by the server.
     */
	// or use file as key: 
	// if ((key = ftok("hello.txt", 'R')) == -1){xxxx} /*Here the file must exist */ 
    // ftok  -  convert  a pathname and a project identifier to a System V IPC key
    key = 1234;
   	 (void) fprintf(stderr, "\nmsgget: Calling msgget(%#lx,%#o)\n",key, msgflg);
	if ((msqid = msgget(key, msgflg )) < 0) {
        perror("msgget");
        exit(1);
    }else {
    	(void) fprintf(stderr,"msgget: msgget succeeded: msqid = %d\n", msqid);
    }

	/*
     * We'll send message type 1
     */
     
    sbuf.mtype = 1;
    (void) fprintf(stderr,"msgget: msgget succeeded: msqid = %d\n", msqid);
    (void) strcpy(sbuf.mtext, "Did you get this?");
    (void) fprintf(stderr,"msgget: msgget succeeded: msqid = %d\n", msqid);
    buf_length = strlen(sbuf.mtext) + 1 ;

	/*
     * Send a message.
     */
    if (msgsnd(msqid, &sbuf, buf_length, IPC_NOWAIT) < 0) {
		printf ("%d, %d, %s, %d\n", msqid, sbuf.mtype, sbuf.mtext, buf_length);
        perror("msgsnd");
        exit(1);
    } else 
      printf("Message: \"%s\" Sent\n", sbuf.mtext);
      
    exit(0);
}